﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VisualAgile.IBLL;
using VisualAgile.Model;
using System.Collections;

namespace VisualAgile.Demo
{
    public class FakeActualManager : IActualsManager   
    {
        private List<Actual> actualList;

        public FakeActualManager(List<Actual> actuals)
        {
            actualList = actuals;
        }

        /// <summary>
        /// Create a actual (back to contain the default value)
        /// </summary>
        /// <returns></returns>
        public Actual NewActual()
        {
            var actual = new Actual();
            
            actual.CreateTime = DateTime.Now;            

            return actual;
        }

        /// <summary>
        /// Save actual
        /// </summary>
        /// <param name="actual">Actual entity</param>
        /// <returns></returns>
        public Actual Save(Actual actual)
        {
            Validate(actual);
            if (Get(actual.ActualID) != null)
                throw new Exception("Existing actual");
            actual.ActualID = Guid.NewGuid();
            actualList.Add(actual);

            return Get(actual.ActualID);
        }

        /// <summary>
        /// Access to actuals
        /// </summary>
        /// <param name="actualId">Actual ID</param>
        /// <returns></returns>
        public Actual Get(Guid actualId)
        {
            return actualList.SingleOrDefault(u => u.ActualID == actualId);
        }     

        /// <summary>
        /// Access to actuals
        /// </summary>
        /// <param name="actualId">Task ID</param>
        /// <returns></returns>
        public IList GetByTask(string taskId)
        {
            return actualList.FindAll(f => f.TaskID == taskId);
        }

        /// <summary>
        /// Access to actuals
        /// </summary>
        /// <param name="actualId">Label ID</param>
        /// <returns></returns>
        public IList GetByLabel(string labelId)
        {
            return actualList.FindAll(f => f.Label.LabelID == new Guid(labelId));
        }      

        /// <summary>
        /// Delete Actual
        /// </summary>
        /// <param name="actualId">Actual ID</param>
        /// <returns></returns>
        public void Delete(Guid actualId)
        {
            var actual = Get(actualId);
            actualList.Remove(actual);
        }

        /// <summary>
        /// Update Actual
        /// </summary>
        /// <param name="actual">Actual Entity</param>
        /// <returns></returns>
        public Actual Update(Actual actual)
        {
            return Get(actual.ActualID);
        }

        /// <summary>
        /// Access to stories
        /// </summary>
        /// <returns></returns>
        public IList GetAll()
        {
            return actualList;
        }

        private void Validate(Actual actual)
        {
            //TODO throw exception on error.
        }        
    }
}
